iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
3
AI & Data

python 入門到分析股市系列 第 23

[Day23]抓取股票 - twstock、pandas-datareader

  • 分享至 

  • xImage
  •  

前言

今天是鐵人的第23天,主要介紹兩個抓取股票的套件,本來是要用爬蟲的方式擷取網路的股價資訊,後來發現這兩個套件,就想說那就用這兩個套件來取得歷史資料。之後幾天才會有抓取綜合損益表和資產負債表的文章。

  1. twstock
  2. pandas-datareader

twstock

可以下以下的指令,看Anaconda是否有安裝twstock

conda list

如果沒有安抓的話可以使用以下語法安裝

pip install twstock

twstock套件有非常多好用的function,以下示範列出台灣的所有股票,只是這個function非常吃資源,筆者跑了一次等了很久才出現。

import twstock
print(twstock.codes)

如果只是看某個股票可以使用

print(twstock.codes['6207'])
# 輸出結果
StockCodeInfo(type='股票', code='6207', name='雷科', ISIN='TW0006207004', start='2002/12/23', market='上櫃', group='電子零組件業', CFI='ESVUFR')

twstock.Stock()

之後實現要抓取的股票的歷史資料(抓取最近31天的資料),假設要抓雷科(6207)

# 這是抓取歷史資料
stock_6207 = twstock.Stock('6207')

price_6207 = stock_6207.price[-5:]       # 近五日之收盤價
high_6207 = stock_6207.high[-5:]         # 近五日之盤中高點
low_6207 = stock_6207.low[-5:]           # 近五日之盤中低點
date_6207 = stock_6207.date[-5:]         # 近五日的日期

print('price_6207--->', price_6207)
print('high_6207--->', high_6207)
print('low_6207--->', low_6207)
print('date_6207--->', date_6207)
# 輸出結果
price_6207---> [30.25, 29.05, 29.35, 28.25, 28.45]
high_6207---> [30.4, 30.45, 29.75, 28.8, 29.1]
low_6207---> [29.35, 29.05, 29.0, 28.0, 28.0]
date_6207---> [datetime.datetime(2018, 10, 22, 0, 0), datetime.datetime(2018, 10, 23, 0, 0), datetime.datetime(2018, 10, 24, 0, 0), datetime.datetime(2018, 10, 25, 0, 0), datetime.datetime(2018, 10, 26, 0, 0)]

twstock.fetch()

如果要抓取超過31天的資料可以使用fetch(),以下示範抓雷科(6207),2017年10月的資料

stock_6207_2017_10 = stock_6207.fetch(2017,10)      # 獲取 2017 年 10 月之股票資料

當然還可以使用取得從過去到現在的股價,下面示範從2018年01月到現在的資料,並且用開盤價和收盤價畫成圖表

import matplotlib.pyplot as plt
import pandas as pd


stock_6207_2018 = stock_6207.fetch_from(2018,1)     # 獲取 2018 年 01 月至今日之股票資料
stock_6207_2018_pd = pd.DataFrame(stock_6207_2018)
stock_6207_2018_pd = stock_6207_2018_pd.set_index('date')


fig = plt.figure(figsize=(10, 6))
plt.plot(stock_6207_2018_pd.close, '-' , label="收盤價")
plt.plot(stock_6207_2018_pd.open, '-' , label="開盤價")
plt.title('雷科股份2018 開盤/收盤價曲線',loc='right')
# loc->title的位置
plt.xlabel('日期')
plt.ylabel('收盤價')
plt.grid(True, axis='y')
plt.legend()
fig.savefig('day20_01.png')

https://ithelp.ithome.com.tw/upload/images/20181026/20111390yoo59kX1ZY.png

realtime()

這個套件不只可以抓取歷史資料也可以抓取即時資料。

stock_6207_real = twstock.realtime.get('6207')
# 抓取多個股票的方式 twstock.realtime.get(['2330', '2337', '2409'])
stock_6207_real
# 輸出結果
{'timestamp': 1540449000.0,
 'info': {'code': '6207',
  'channel': '6207.tw',
  'name': '雷科',
  'fullname': '雷科股份有限公司',
  'time': '2018-10-25 14:30:00'},
 'realtime': {'latest_trade_price': '28.25',
  'trade_volume': '61',
  'accumulate_trade_volume': '931',
  'best_bid_price': ['28.20', '28.15', '28.10', '28.05', '28.00'],
  'best_bid_volume': ['7', '29', '15', '10', '105'],
  'best_ask_price': ['28.25', '28.30', '28.40', '28.45', '28.50'],
  'best_ask_volume': ['6', '2', '1', '11', '5'],
  'open': '28.20',
  'high': '28.80',
  'low': '28.00'},
 'success': True}

從上面可以看出抓取即時資料只會抓出一筆,所以需要用schedule定時去抓,筆者等30天後在實作看看用aws的lambda去抓取。


pandas-datareader

可以下以下的指令,看Anaconda是否有安裝pandas-datareader

conda list

如果沒有的話則下

conda install pandas-datareader

抓取股票資訊

使用以下函式抓取yahoo歷史資料,台灣股市的話要用 股票代號 加上 .TW

import pandas_datareader as pdr
df_2330 = pdr.DataReader('2330.TW', 'yahoo')

回傳的格式規格

參數名稱 描述
Open 開盤價
High 最高價
Low 最低價
Close 收盤價
Volume 交易量
Adj Close 經過調整的收盤價

如果要加上擷取某個時段的歷史資料

startTime = '2018-10-01'
endTime = '2018-10-30'
df_2330 = pdr.DataReader('2330.TW', 'yahoo', startTime, endTime)

參考資料

pandas_datareader

之前的章節


上一篇
[Day22]分析股票 - 股票基本常識
下一篇
[Day24] 分析股票 - 基礎股票分析
系列文
python 入門到分析股市30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
porterchen
iT邦新手 5 級 ‧ 2020-08-31 23:08:06

小弟是新手,想要請教在prompt安裝完twstock後,improt twstock指令是要在哪一個環境下? prompt or Jupyter notebook? 感恩

_mr_wang_ iT邦新手 5 級 ‧ 2021-05-28 13:44:17 檢舉

在Jupyter notebook中

0
idea-stu
iT邦新手 5 級 ‧ 2022-03-25 17:56:29

錯字:沒有安『抓』XD
程式碼位置放到 day22 的了
想直接應用所以從這篇開始跟
前面幾篇真的很詳細解說基礎語法 大推!

我要留言

立即登入留言